import 'package:flutter/material.dart';
import 'package:flutter_study/flutter/_17%E7%8A%B6%E6%80%81(%E6%95%B0%E6%8D%AE%E5%85%B1%E4%BA%AB)/viewmodel/counter_view_model.dart';
import 'package:provider/provider.dart';

// 在应用程序顶层(即MyApp)包裹Provider
// 建议新建viewmodel包声明要共享的数据

/*
* 两种使用共享数据的方式：
*   1.Provider.of：当Provider中数据发生改变时，Provider.of所在的Widget的整个build方法被重新执行
*   2.Consumer：推荐使用该方法，Provider数据改变时，只会重新执行Consumer的build方法
* */
void main() {
  /* runApp(ChangeNotifierProvider(
    create: (ctx) => CounterViewModel(),
    child: MyApp(),
  ));*/

  // 如果有多个ViewModel共享数据
  runApp(MultiProvider(
   /* providers:
        providers *//*[
      ChangeNotifierProvider(create: (ctx) => CounterViewModel()),
      ChangeNotifierProvider(create: (ctx) => UserViewModel()),
    ]*//*
    ,
    child: MyApp(),*/
  ));
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Provider',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        splashColor: Colors.transparent,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Provider'),
        ),
        // 使用Consumer共享数据，当数据源改变会重新调用Consumer的builder方法
        // 数据需要重新赋值，而Icon等静态Widget不需要重新构建
        // 对于FloatingActionButton优化：将Consumer改用Selector
        floatingActionButton: Consumer<CounterViewModel>(
          builder: (ctx, counterVM, child) {
            return FloatingActionButton(
              onPressed: () {
                counterVM.counter += 1;
              },
              // 移动到Consumer中，防止重新构建，提高性能
              // child: Icon(Icons.add),
              // child参数为外界传过来我们定义的Child：Icon
              child: child,
            );
          },
          // 放在外界，不会重新构建Icon
          child: Icon(Icons.add),
        ),
        body: HomePage(),
      ),
    );
  }
}

// 使用InheritedWidget共享数据，管理状态
// 之前想要给Demo1Widget、Demo2Widget共享数据可以通过构造方法传入，但是这两个Widget里面还有各自节点
// 参数多次传递很麻烦
class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Demo1Widget(),
          Demo2Widget(),
        ],
      ),
    );
  }
}

class Demo1Widget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    int _counter = Provider.of<CounterViewModel>(context).counter;
    return Container(
      color: Colors.red,
      child: Text("当前计数 $_counter"),
    );
  }
}

class Demo2Widget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 改用Consumer
    //int _counter = Provider.of<CounterViewModel>(context).counter;
    return Container(
      color: Colors.blue,
      child: Consumer<CounterViewModel>(
        builder: (ctx, counterVM, child) {
          return Text("${counterVM.counter}");
        },
      ),
    );
  }
}
